package com.attendance.sz.utils;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

//import org.apache.tools.zip.ZipEntry;
//import org.apache.tools.zip.ZipFile;
//import org.apache.tools.zip.ZipOutputStream;

public class ZipExtractorTask extends AsyncTask<Void, Integer, Long> {
	private final String TAG = "martrin";
	private final File mInput;
	private final File mOutput;
	private final String sInput;
	private final String sOutput;
	private final ProgressDialog mDialog;
	private int mProgress = 0;
	private final Context mContext;
	private boolean mReplaceAll;
	private static Handler handler;

	public ZipExtractorTask(String in, String out, Handler myhandler, Context context,
			boolean replaceAll) {
		super();
		sInput = in;
		sOutput = out;
		mInput = new File(in);
		mOutput = new File(out);
		if (!mOutput.exists()) {
			if (!mOutput.mkdirs()) {
				Log.e(TAG,"Failed to make directories:" + mOutput.getAbsolutePath());
			}
		}
		if (context != null) {
			mDialog = new ProgressDialog(context);
		} else {
			mDialog = null;
		}
		mContext = context;
		handler = myhandler;
		mReplaceAll = replaceAll;
	}

	@Override
	protected Long doInBackground(Void... params) {
		// TODO Auto-generated method stub
		//return unzip();
		try {
			readByApacheZipFile(sInput, sOutput);
			//完了之后要通知
			Message msg = new Message();
			msg.what = 12;
			msg.obj = "12";
			handler.sendMessage(msg);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		} catch (ZipException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
		return 3L;
	}

	@Override
	protected void onPostExecute(Long result) {
		// TODO Auto-generated method stub
		// super.onPostExecute(result);
		if (mDialog != null && mDialog.isShowing()) {
			mDialog.dismiss();
		}
		if (isCancelled())
			return;
	}

	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		// super.onPreExecute();
		if (mDialog != null) {
			mDialog.setTitle("Extracting");
			mDialog.setMessage(mInput.getName());
			mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mDialog.setOnCancelListener(new OnCancelListener() {

				@Override
				public void onCancel(DialogInterface dialog) {
					// TODO Auto-generated method stub
					cancel(true);
				}
			});
			mDialog.show();
		}
	}

	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		// super.onProgressUpdate(values);
		if (mDialog == null)
			return;
		if (values.length > 1) {
			int max = values[1];
			mDialog.setMax(max);
		} else
			mDialog.setProgress(values[0].intValue());
	}

//	private long unzip() {
//		long extractedSize = 0L;
//		Enumeration<ZipEntry> entries;
//		ZipFile zip = null;
//		try {
//			zip = new ZipFile(mInput);
//			long uncompressedSize = getOriginalSize(zip);
//			publishProgress(0, (int) uncompressedSize);
//
//			entries = (Enumeration<ZipEntry>) zip.entries();
//			while (entries.hasMoreElements()) {
//				ZipEntry entry = entries.nextElement();
//				if (entry.isDirectory()) {
//					continue;
//				}
//				File destination = new File(mOutput, entry.getName());
//				if (!destination.getParentFile().exists()) {
//					Log.e(TAG, "make="
//							+ destination.getParentFile().getAbsolutePath());
//					destination.getParentFile().mkdirs();
//				}
//				if (destination.exists() && mContext != null && !mReplaceAll) {
//
//				}
//				ProgressReportingOutputStream outStream = new ProgressReportingOutputStream(
//						destination);
//				extractedSize += copy(zip.getInputStream(entry), outStream);
//				outStream.close();
//			}
//		} catch (ZipException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} finally {
//			try {
//				zip.close();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
//		return extractedSize;
//	}
//
//	private long getOriginalSize(ZipFile file) {
//		Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) file.entries();
//		long originalSize = 0l;
//		while (entries.hasMoreElements()) {
//			ZipEntry entry = entries.nextElement();
//			if (entry.getSize() >= 0) {
//				originalSize += entry.getSize();
//			}
//		}
//		return originalSize;
//	}
//
//	private int copy(InputStream input, OutputStream output) {
//		byte[] buffer = new byte[1024 * 8];
//		BufferedInputStream in = new BufferedInputStream(input, 1024 * 8);
//		BufferedOutputStream out = new BufferedOutputStream(output, 1024 * 8);
//		int count = 0, n = 0;
//		try {
//			while ((n = in.read(buffer, 0, 1024 * 8)) != -1) {
//				out.write(buffer, 0, n);
//				count += n;
//			}
//			out.flush();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} finally {
//			try {
//				out.close();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			try {
//				in.close();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
//		return count;
//	}

	private final class ProgressReportingOutputStream extends FileOutputStream {
		public ProgressReportingOutputStream(File file)
				throws FileNotFoundException {
			super(file);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void write(byte[] buffer, int byteOffset, int byteCount)
				throws IOException {
			// TODO Auto-generated method stub
			super.write(buffer, byteOffset, byteCount);
			mProgress += byteCount;
			publishProgress(mProgress);
		}

	}

	public void doZipExtractorWork() {
		// ZipExtractorTask task = new
		// ZipExtractorTask("/storage/usb3/system.zip",
		// "/storage/emulated/legacy/", this, true);
		// ZipExtractorTask task = new
		// ZipExtractorTask("/storage/emulated/legacy/testzip.zip",
		// "/storage/emulated/legacy/", this, true);
		// task.execute();
	}

	
	
	
	/** 
     *  
     * [* 使用 org.apache.tools.zip.ZipFile 解压文件，它与 java 类库中的 
     * java.util.zip.ZipFile 使用方式是一新的，只不过多了设置编码方式的 接口。 
     *  
     * 注，apache 没有提供 ZipInputStream 类，所以只能使用它提供的ZipFile 来读取压缩文件。]<BR> 
     *  
     * @param archive 压缩包路径 
     * @param decompressDir 解压路径 
     * @throws IOException 
     * @throws FileNotFoundException 
     * @throws ZipException 
     */  
  
    @SuppressWarnings("unchecked")  
    public static void readByApacheZipFile(String archive, String decompressDir)  
        throws IOException, FileNotFoundException, ZipException  
    {
    	//Log.e(TAG, "readByApacheZipFile");  
    	BufferedInputStream bi;  
        //ZipFile zf = new ZipFile(archive, "GBK");//支持中文   
    	ZipFile zf = new ZipFile(archive);//
        Enumeration e = zf.entries();//zf.getEntries();  
        while (e.hasMoreElements())  
        {  
            ZipEntry ze2 = (ZipEntry) e.nextElement();  
            String entryName = ze2.getName();  
            String path = decompressDir + "/" + entryName;  
            if (ze2.isDirectory())  
            {  
                //Log.e(TAG, "正在创建解压目录 - " + entryName);  
                File decompressDirFile = new File(path);  
                if (!decompressDirFile.exists())  
                {  
                    decompressDirFile.mkdirs();  
                }  
            }  
            else  
            {  
                //Log.e(TAG, "正在创建解压文件 - " + entryName);  
                String fileDir = path.substring(0, path.lastIndexOf("/"));  
                File fileDirFile = new File(fileDir);  
                if (!fileDirFile.exists())  
                {  
                    fileDirFile.mkdirs();  
                }  
                BufferedOutputStream bos = new BufferedOutputStream(  
                    new FileOutputStream(decompressDir + "/" + entryName));  
                bi = new BufferedInputStream(zf.getInputStream(ze2));  
                byte[] readContent = new byte[1024];  
                int readCount = bi.read(readContent);  
                while (readCount != -1)  
                {  
                    bos.write(readContent, 0, readCount);  
                    readCount = bi.read(readContent);  
                }  
                bos.close();  
            }  
        }  
        zf.close();  
    }


	public static boolean requestDownload(URL url, String filename) {
		try {
			// 打开连接
			URLConnection con = url.openConnection();
			//获得文件的长度
			int contentLength = con.getContentLength();
			System.out.println("长度 :"+contentLength);
			// 输入流
			InputStream is = con.getInputStream();
			// 1K的数据缓冲
			byte[] bs = new byte[1024];
			// 读取到的数据长度
			int len;
			// 输出的文件流
			OutputStream os = new FileOutputStream(filename);
			// 开始读取
			while ((len = is.read(bs)) != -1) {
				os.write(bs, 0, len);
			}
			// 完毕，关闭所有链接
			os.close();
			is.close();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}
}
